package GlobalObservingSystem.Mundo.Usuarios;

import GlobalObservingSystem.Mundo.BaseDatos.EventoBD;
import GlobalObservingSystem.Mundo.BaseDatos.UsuarioBD;
import GlobalObservingSystem.Interfaces.IAdminUsuarios;
import GlobalObservingSystem.Mundo.BaseDatos.AdministradorBD;
import GlobalObservingSystem.Mundo.Coordenada;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que representa un usuario administrador,
 * @author Luis Eduardo Pattaquiva
 */
public class AdministradorUsuario implements IAdminUsuarios
{
    /**
     *
     */
    private EventoBD[] eventos;
    /**
     *
     */
    private UsuarioBD usuario;

    private AdministradorBD admin;

    public AdministradorUsuario()
    {
        admin = AdministradorBD.getInstance();
    }

    /**
     * Dado un Id retorna un usuario de la base de datos.
     * @param String Login del usuario que esta buscando
     * @return UsuarioBD Usuario pedido
     */
    public UsuarioBD consultarUsuario(String login)
    {
        try {
           usuario = admin.darUserSeudonimo(login);
        } catch (Exception ex) {
            Logger.getLogger(AdministradorUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return usuario;
    }

    /**
     * Retorna si exite un usuario, con el login dado
     * @param login, login del usuario que desea validad
     * @return, retorna true si el usuario existe , false si el usuario no existe
     */
    public boolean existeUsuario(String login)
    {
        boolean encontro = false;
        consultarUsuario(login);
        if(usuario != null)
        {
            encontro = true;
        }
        return encontro;
    }

    /**
     * Metodo que retorna el evento actual
     * @return Evento Actual
     */
    public EventoBD getEvento()
    {
        return null;
    }

    /**
     * Metoro de registra un usuario nuevo.
     * @param login Login para ingresar al sistema
     * @param password Password para entrar al sistema
     * @param tipoUser Tipo del usuario,
     * @param nombreUser Nombre del usuario
     * @param email Email del usuario
     * @return Si fue posible registrarlo retorna true si no false.
     */
    public boolean registrarUsuario(String login, String password, String tipoUser, String nombreUser, String email)
    {
        
        try {

            if( login == null || password == null || tipoUser == null || nombreUser == null || email == null )
            {
                System.out.println("PUCHA");
                return false;
            }

            if(!existeUsuario(login))
            {
                admin.ingresarUsuario(login, nombreUser, tipoUser, password,email );
                
                return true;
            }
        } catch (Exception ex)
        {
            Logger.getLogger(AdministradorUsuario.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

        return false;
    }

     /**
     * Metoro que guarda un usuario.
     * @param login Login para ingresar al sistema
     * @param password Password para entrar al sistema
     * @param tipoUser Tipo del usuario,
     * @param nombreUser Nombre del usuario
     * @param email Email del usuario
     * @return Si fue posible guardar el usuario retorna true si no false.
     */
    public boolean guardarUsuario(String login, String password, String tipoUser, String nombreUser, String email)
    {
        return false;
    }

    /**
     * Metoro que elimina un usuario
     * @return Si fue borrado retorna true si no false
     */
    public boolean eliminarUsuario()
    {
        if( usuario == null )
        {
            System.out.println("Ohh no");
            return false;
        }

        System.out.println( usuario.getNombre() );
            

        boolean b = false;

        try
        {
            b = admin.eliminarUser(usuario.getSeudonimo());
            if( b )
                usuario = null;
        } catch (Exception ex)
        {
            Logger.getLogger(AdministradorUsuario.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Ohh 2");
        }

        return b;
    }

     /**
     * Metodo que modifica un usuario.
     * @param login Login para ingresar al sistema
     * @param password Password para entrar al sistema
     * @param tipoUser Tipo del usuario,
     * @param nombreUser Nombre del usuario
     * @param email Email del usuario
     * @return Si fue posible modificar el usuario retorna true si no false.
     */
    public boolean modificarUsuario(String login, String password, String tipoUser, String nombreUser, String email)
    {
        if( existeUsuario(login) )
        {
            eliminarUsuario();
            registrarUsuario(login, password, nombreUser, nombreUser, email);
            return true;
        }
        return false;
    }

    /**
     * Metoro para ingresar al sistema
     * @param login Login del usuario
     * @param password Password del usuario
     * @return Si pudo ingresar retorna true, si no false
     */
    public boolean ingresarSistema( String login, String password)
    {
        UsuarioBD u = consultarUsuario(login);
        if( u != null && u.validarPassword(password))
        {
            usuario = u;
            return true;
        }
        return false;
    }


     /**
    * Suscribe un usuario a un evento
    * @param tipo Tipo del evento
    * @param variacion variacion del evento
    * @param valor Valor del eventro
    * @param latitud1 latitud del evento
    * @param longitud1 longitud del evento
    * @param latitud2 latitud del evento
    * @param longitud2 longitud del evento
    */
    public void suscribirEvento(String tipo, String variacion, double valor, Coordenada latitud1, Coordenada longitud1, Coordenada latitud2, Coordenada longitud2)
    {

    }

      /**
     * Valida el acceso del los usuario
     * @param login login del usuario
     * @param password Contraseña del usuario
     * @return true si es valido , false si no es valido
     */
    public boolean validarAcceso(String login, String password)
    {
        return false;
    }

    /**
     * Retorna el nombre del usuario
     * @return nombre del usuario
     */
    public String getNombreUser()
    {
        return (usuario!=null)?usuario.getNombre():"";
    }

     /**
     * Retorna el mail del usuario
     * @return mail del usuario
     */
    public String getEmailUser()
    {
        return (usuario!=null)?usuario.getEmail():"";
    }

    public UsuarioBD getUsuario()
    {
        return usuario;
    }

    public boolean suscribirSitio( double latitud, double longitud )
    {
        try {
            admin.suscripcion(usuario.getSeudonimo(), latitud, longitud);
            return true;
        } catch (Exception ex) {
            Logger.getLogger(AdministradorUsuario.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    public boolean esClimatologo()
    {
        return usuario.getTipoUsuario().startsWith("C") || usuario.getTipoUsuario().startsWith("c");
    }
}
